跳到主要内容

部署 faas

faas 是什么?

"Faas" 是 "Function as a Service" 的缩写,意为“函数即服务”或“以函数为基础的服务”。这是一种云计算服务模型,它是 Serverless 架构的一部分。在 Faas 模型中,开发者可以编写单一功能(函数),然后将这些函数上传到云平台,而无需关心底层的服务器和基础设施管理。当函数需要执行时,云平台会自动处理函数的调用和资源分配。

Faas 的主要优势包括:

  1. 弹性伸缩: 云平台会根据负载动态地调整底层的资源,确保函数能够快速、高效地执行,而无需手动干预。

  2. 按需计费: 开发者只需为实际执行的函数付费,而不必为预留的计算资源付费。这使得成本更加可控和经济高效。

  3. 简化部署和管理: 函数作为独立的单元,更容易进行部署、升级和维护。开发者可以专注于编写功能性代码,而无需处理底层的操作系统、网络配置等。

  4. 快速开发和迭代: Faas 支持快速开发和迭代,因为开发者只需关注单一函数的逻辑,而不必担心整个应用的复杂性。

在 Faas 模型中,典型的使用场景包括无服务器计算、事件驱动架构、微服务等。 AWS Lambda、Azure Functions 和 Google Cloud Functions 等云平台提供了 Faas 服务。

这里使用的是 OpenFaaS,它是一个开源的 Serverless 平台,可以在任何地方运行,包括公有云、私有云、Kubernetes 等。OpenFaaS 由 Docker 和 Kubernetes 驱动,支持多种编程语言,包括 Go、Node.js、Python、Ruby、PHP、C# 等。

各个模块的介绍

以下是 OpenFaaS 中一些重要的模块及其作用的简要介绍:

  1. Gateway(网关):

    • 作用: 接收 HTTP 请求,并将其路由到相应的函数。
    • 描述: Gateway 充当着 OpenFaaS 的主要入口点,它负责处理传入的请求,并将其转发给适当的函数进行处理。Gateway 通常与 OpenFaaS UI 集成,使用户能够通过 Web 界面管理函数。
  2. Function(函数):

    • 作用: 包含实际的业务逻辑代码,用于处理请求。
    • 描述: 函数是用户编写的业务逻辑的核心部分。每个函数都是一个独立的单元,可以独立部署和运行。函数可以使用各种编程语言编写,因为 OpenFaaS 提供了多语言支持。
  3. Watcher(观察器):

    • 作用: 监视函数的状态变化,并在需要时触发自动缩放。
    • 描述: Watcher 负责监控函数的运行状况,以便根据负载情况进行动态的伸缩。当函数的请求量增加时,Watcher 可以自动地扩展函数实例数量,以确保有足够的资源来处理请求。
  4. Prometheus(监控):

    • 作用: 用于收集和存储系统和函数的监控数据。
    • 描述: Prometheus 是一个开源的监控和警报工具,用于收集和存储时间序列数据。OpenFaaS 集成了 Prometheus,以便用户可以监控函数的性能、资源使用情况等指标,并通过 Prometheus 的查询语言进行分析。
  5. Alertmanager(警报管理器):

    • 作用: 处理 Prometheus 收集的告警,并触发相应的操作。
    • 描述: Alertmanager 用于管理 Prometheus 收集的告警信息。它可以配置为发送通知、执行脚本等,以响应系统中发生的事件。通过 Alertmanager,用户可以及时了解系统中的问题并采取适当的措施。
  6. NATS(消息传递):

    • 作用: 提供事件驱动的消息传递机制。
    • 描述: OpenFaaS 使用 NATS(可用于代替 Kafka 或其他消息队列)作为事件驱动的消息传递系统。当函数完成处理请求时,它可以发布消息到 NATS,从而触发其他函数或系统中的相关操作。
  7. Kubernetes(容器编排):

    • 作用: OpenFaaS 基于 Kubernetes 提供容器编排和管理。
    • 描述: OpenFaaS 利用 Kubernetes 提供的容器编排功能来管理函数的部署、伸缩和运行。Kubernetes 提供了一个强大的基础设施,使得 OpenFaaS 可以在各种环境中运行,并提供高度可扩展性和弹性。

这些模块共同工作,使得 OpenFaaS 成为一个灵活且强大的 Serverless 平台,适用于构建和运行无服务器应用程序。

Kubernetes下部署

helm repo add openfaas https://openfaas.github.io/faas-netes/

kubectl create namespace openfaas

# 先下载模板
helm pull openfaas/openfaas --untar

修改这个 values.yaml 文件

# ingress configuration
ingress:
enabled: false
## For k8s >= 1.18 you need to specify the pathType
## See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#better-path-matching-with-path-types
#pathType: ImplementationSpecific

# Used to create Ingress record (should be used with exposeServices: false).
hosts:
- host: gateway.openfaas.local # Replace with gateway.example.com if public-facing
serviceName: gateway
servicePort: 8080
path: /
annotations:
kubernetes.io/ingress.class: nginx
tls:
# Secrets must be manually created in the namespace.

然后再部署

helm upgrade --install openfaas ./openfaas --namespace openfaas -f values.yaml

获取 OpenFaaS 的初始密码: 使用以下命令获取 OpenFaaS 管理员密码。

kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode

访问 OpenFaaS

References